-- Copyright (c) 2015,2016 Lucky Byte, Inc.
--
-- Summary : POS 009.1 实时代付模块
--
-- Author  : 吴小虎 <xiaohu@lucky-byte.com>
-- Since   : 2016.4.29
--
-- History
--  * 2015.4.29 吴小虎 : 创建此文件
--

-- POS 009.1 代付交易通过 48 域上送原始消费信息
-- 48 域附加信息
--   1. 原商户编号 ANS15;
--   2. 原终端编号 ANS8 ;
--   3. 原始交易批次号   N6;
--   4. 原始交易POS流水号 N6;
--   5. 原始交易授权号 AN6;
--   6. 检索参考号 AN12;
--   7. 原始交易日期 N4;
--   8. 原交易主账号 N19，不足右补空格;
--   9. 原交易金额 N12;
--

if not reqt or not p1 then
    logger.error('交易执行环境不完整，缺少 reqt or p1 ...')
    return nil
end


-- 查询消费交易信息
local _get_t20_info = function()
    local _priv = reqt.packet.get('48')
    if not _priv then
        logger.error('终端上送报文缺少48域，不能获取原始交易信息.')
        return '10'
    end
    if string.len(_priv) < 166 then
        logger.error('终端上送报文48域数据长度错误.')
        return '10'
    end

    local _f48 = {
        usage    = string.sub(_priv, 1, 2),      -- 用法
        _        = string.sub(_priv, 3, 4),      -- 用户号码类型
        _        = string.sub(_priv, 5, 44),     -- 用户号码
        _        = string.sub(_priv, 45, 48),    -- 用户号码地区编码
        _        = string.sub(_priv, 49, 52),    -- 用户号码附加地区编码
        _        = string.sub(_priv, 53, 58),    -- 缴费月份
        _        = string.sub(_priv, 59, 75),    -- 支付区间
        data_len = string.sub(_priv, 76, 78),    -- 附加子域长度
        merno    = string.sub(_priv, 79, 93),    -- 原商户编号
        termid   = string.sub(_priv, 94, 101),   -- 原终端编号
        batchnum = string.sub(_priv, 102, 107),  -- 原始交易批次号
        tracenum = string.sub(_priv, 108, 113),  -- 原始交易POS流水号
        authcode = string.sub(_priv, 114, 119),  -- 原始交易授权号
        retrefno = string.sub(_priv, 120, 131),  -- 检索参考号
        trtime   = string.sub(_priv, 132, 135),  -- 原始交易日期
        pri_acct = string.sub(_priv, 136, 154),  -- 原交易主账号
        tramt    = string.sub(_priv, 155, 166),  -- 原交易金额
    }
    -- 检查代付报文金额与原消费交易是否一致
    if _f48.tramt ~= reqt.packet.get('4') then
        logger.error('代付报文交易金额[%s]与原消费金额[%s]不一致.',
            reqt.packet.get('4'), _f48.tramt)
        return '08'
    end

    -- 查询原消费交易
    local _table = jdbc.select([[
        select * from pay_trlist
        where
            status = 0 and chnl = 1 and incoming = true and
            json_extract_path_text(i_pkt, '4')  = ? and
            json_extract_path_text(i_pkt, '11') = ? and
            json_extract_path_text(i_pkt, '41') = ? and
            json_extract_path_text(i_pkt, '42') = ? and
            json_extract_path_text(o_pkt, '37') = ? and
            json_extract_path_text(o_pkt, '39') = '00'
    ]], _f48.tramt, _f48.tracenum, _f48.termid, _f48.merno, _f48.retrefno)
    if not _table or _table.count == 0 then
        logger.error('通过代付交易报文信息未查询到对应的消费交易，停止代付.')
        return '05'
    end
    assert(_table.count == 1, '通过 POS 009.1 代付报文查询到多笔消费交易?')

    -- 保存原消费交易记录
    p1.t20_info = _table.get_record(0)

    -- 保存一些附加信息
    p1.t20_info.tramt  = round(tonumber(_f48.tramt) / 100)
    p1.t20_info.merno  = _f48.merno
    p1.t20_info.termid = _f48.termid

    return '00'
end


-- 构造 POS 009.1 代付成功响应报文
local _build_respkt = function()
    local _respkt = resp.respkt('00')

    _respkt.set('3',  reqt.packet.get('3'))
    _respkt.set('4',  reqt.packet.get('4'))
    _respkt.set('11', reqt.packet.get('11'))
    _respkt.set('12', os.date('%H%M%S'))
    _respkt.set('13', os.date('%m%d'))
    _respkt.set('15', os.date('%m%d'))
    _respkt.set('25', reqt.packet.get('25'))
    _respkt.set('37', os.date('%y%m%d%H%M%S'))
    _respkt.set('41', reqt.packet.get('41'))
    _respkt.set('42', reqt.packet.get('42'))
    _respkt.set('49', reqt.packet.get('49'))

    -- 添加 MAC
    local _keys = core.json.decode(reqt.term.get('keys'))
    lib091.set_mac(_respkt, reqt.term.get('tmk'),
        _keys.mak, reqt.term.get('macalgo'))

    return _respkt
end


return {
    get_t20_info = _get_t20_info,
    build_respkt = _build_respkt,
}
